package cn.ming.wfchat.app.me.activity;

import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.HashMap;

import cn.ming.wfchat.R;
import cn.ming.wfchat.app.AppService;
import cn.ming.wfchat.app.me.activity.model.ConstListbean;
import cn.ming.wfchat.app.utils.CloudTagManager;
import cn.ming.wfchat.app.utils.StatusBarUtil;
import cn.ming.wfchat.kit.utils.Tools;

public class CloudTagActivity extends Activity implements CloudTagManager.OnClickCallback {
    private CloudTagManager keywordsFlow;
    private RelativeLayout rl;
    private TextView tvSan, tvNo;
    private PathMeasure mPathMeasure;
    SoundPool sp;//声明SoundPool的引用
    HashMap<Integer, Integer> hm;//声明HashMap来存放声音文件
    int currStaeamId;//当前正播放的streamId
    private ConstListbean constListbean;
    private ImageView iv_back;


    /**
     * 贝塞尔曲线中间过程的点的坐标
     */
    private float[] mCurrentPosition = new float[2];

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clound_tag);
        StatusBarUtil.setColor(this, getResources().getColor(R.color.color_007aff));
        rl = (RelativeLayout) findViewById(R.id.rl);
        tvSan = findViewById(R.id.tv_san);
        tvNo = findViewById(R.id.tv_no);
        iv_back = findViewById(R.id.iv_back);
        keywordsFlow = (CloudTagManager) findViewById(R.id.keywordsFlow);
        keywordsFlow.setDuration(100);
        keywordsFlow.setOnItemClickListener(this);
        initSoundPool();
        initDate();
        iv_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        addShowViewAnimation(tvNo);

    }


    void initDate() {
        AppService.Instance().coinList(new AppService.ConstListCallback() {
            @Override
            public void onUiSuccess(ConstListbean redPageListBean) {
                constListbean = redPageListBean;
                tvSan.setText("算力：" + redPageListBean.getComputingPower());
                if (redPageListBean.getList().size() < 1) {
                    keywordsFlow.setVisibility(View.GONE);
                    tvNo.setVisibility(View.VISIBLE);
                }
                // 添加
                for (ConstListbean.ListBean listBean : redPageListBean.getList()) {
                    keywordsFlow.feedKeyword(listBean.getAmount() + "FJ");
                }
                keywordsFlow.go2Show(CloudTagManager.ANIMATION_OUT);
            }

            @Override
            public void onUiFailure(int code, String msg) {
                Tools.showToast(CloudTagActivity.this, msg);
            }
        });
        tvSan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Tools.jump(CloudTagActivity.this, EarningsRecordActivity.class, false);
            }
        });
    }

    void collect(String hash) {
        AppService.Instance().collect(hash, new AppService.ConstListCallback() {
            @Override
            public void onUiSuccess(ConstListbean redPageListBean) {

            }

            @Override
            public void onUiFailure(int code, String msg) {
                //  Tools.showToast(CloudTagActivity.this, msg);
            }
        });
    }


//    private void flyIn() {
//        keywordsFlow.rubKeywords();
//        // keywordsFlow.rubAllViews();
//        feedKeywordsFlow(keywordsFlow, keywords);
//        keywordsFlow.go2Show(CloudTagManager.ANIMATION_IN);
//    }
//
//    private void flyOut() {
//        keywordsFlow.rubKeywords();
//        feedKeywordsFlow(keywordsFlow, keywords);
//        keywordsFlow.go2Show(CloudTagManager.ANIMATION_OUT);
//    }

    private void addCart(TextView iv) {
//   一、创造出执行动画的主题---imageview
        //代码new一个imageview，图片资源是上面的imageview的图片
        // (这个图片就是执行动画的图片，从开始位置出发，经过一个抛物线（贝塞尔曲线），移动到购物车里)
//        keywordsFlow.rubKeywords();
//        feedKeywordsFlow(keywordsFlow, keywords);
        keywordsFlow.removeView(iv);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(200, 300);
        rl.addView(iv, params);

//    二、计算动画开始/结束点的坐标的准备工作
        //得到父布局的起始点坐标（用于辅助计算动画开始/结束时的点的坐标）
        int[] parentLocation = new int[2];
        rl.getLocationInWindow(parentLocation);

        //得到商品图片的坐标（用于计算动画开始的坐标）
        int startLoc[] = new int[2];
        iv.getLocationInWindow(startLoc);

        //得到购物车图片的坐标(用于计算动画结束后的坐标)
        int endLoc[] = new int[2];
        tvSan.getLocationInWindow(endLoc);


//    三、正式开始计算动画开始/结束的坐标
        //开始掉落的商品的起始点：商品起始点-父布局起始点+该商品图片的一半
        float startX = startLoc[0] - parentLocation[0] + iv.getWidth() / 2;
        float startY = startLoc[1] - parentLocation[1] + iv.getHeight() / 2;

        //商品掉落后的终点坐标：购物车起始点-父布局起始点+购物车图片的1/5
        float toX = endLoc[0] - parentLocation[0];
        float toY = endLoc[1] - parentLocation[1];

//    四、计算中间动画的插值坐标（贝塞尔曲线）（其实就是用贝塞尔曲线来完成起终点的过程）
        //开始绘制贝塞尔曲线
        Path path = new Path();
        //移动到起始点（贝塞尔曲线的起点）
        path.moveTo(startX, startY);
        //使用二次萨贝尔曲线：注意第一个起始坐标越大，贝塞尔曲线的横向距离就会越大，一般按照下面的式子取即可
        path.quadTo((startX + toX) / 2, startY, toX, toY);
        //mPathMeasure用来计算贝塞尔曲线的曲线长度和贝塞尔曲线中间插值的坐标，
        // 如果是true，path会形成一个闭环
        mPathMeasure = new PathMeasure(path, false);

        //★★★属性动画实现（从0到贝塞尔曲线的长度之间进行插值计算，获取中间过程的距离值）
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
        valueAnimator.setDuration(1000);
        // 匀速线性插值器
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 当插值计算进行时，获取中间的每个值，
                // 这里这个值是中间过程中的曲线长度（下面根据这个值来得出中间点的坐标值）
                float value = (Float) animation.getAnimatedValue();
                // ★★★★★获取当前点坐标封装到mCurrentPosition
                // boolean getPosTan(float distance, float[] pos, float[] tan) ：
                // 传入一个距离distance(0<=distance<=getLength())，然后会计算当前距
                // 离的坐标点和切线，pos会自动填充上坐标，这个方法很重要。
                mPathMeasure.getPosTan(value, mCurrentPosition, null);//mCurrentPosition此时就是中间距离点的坐标值
                // 移动的商品图片（动画图片）的坐标设置为该中间点的坐标
                iv.setTranslationX(mCurrentPosition[0]);
                iv.setTranslationY(mCurrentPosition[1]);
            }
        });
//   五、 开始执行动画
        valueAnimator.start();

//   六、动画结束后的处理
        valueAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            //当动画结束后：
            @Override
            public void onAnimationEnd(Animator animation) {
//                // 购物车的数量加1
                // 把移动的图片imageview从父布局里移除
                rl.removeView(iv);
                if (keywordsFlow.deleteDisplay(iv)) {
                    keywordsFlow.setVisibility(View.GONE);
                    tvNo.setVisibility(View.VISIBLE);
                }
                playSound(1, 0);

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation)  {

            }
        });
    }

    private void playSound(int sound, int loop) {//获取AudioManager引用
        AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
        //获取当前音量
        float streamVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        //获取系统最大音量
        float streamVolumeMax = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        //计算得到播放音量
        float volume = streamVolumeCurrent / streamVolumeMax;
        //调用SoundPool的play方法来播放声音文件
        currStaeamId = sp.play(hm.get(sound), volume, volume, 1, loop, 1.0f);
    }

    private void initSoundPool() {//初始化声音池
        sp = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);//创建SoundPool对象
        hm = new HashMap<Integer, Integer>();//创建HashMap对象
        //加载声音文件，并且设置为1号声音放入hm中
        hm.put(1, sp.load(this, R.raw.wk, 1));
    }

    @Override
    public void OnClick(View v, int index) {
        if (v instanceof TextView) {
            addCart((TextView) v);
            collect(constListbean.getList().get(index).getHash());
        }
    }

    //添加显示动画
    private void addShowViewAnimation(View view) {
        if (null == view) {
            return;
        }
//         objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(getContext(), R.animator.anim_obj);
//        objectAnimator.setTarget(view);
//        objectAnimator.start();
        AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(CloudTagActivity.this,
                R.animator.anim_obj);
        set.setTarget(view);
        set.start();
    }
}
